package app.resources;

import java.io.Serializable;
import java.sql.Timestamp;

import org.commons.libraries.VectorClock;


public class Resource implements Serializable {
		
	
	private static final long serialVersionUID = 248858502213275680L;

	private int resourceKey;
	private VectorClock vc;
	private Context ct;
	private final Timestamp createdOn;

	public Resource(int resourceKey, Context ct, String creatorName) {
		this.resourceKey = resourceKey;
		this.vc = new VectorClock();
		this.ct = ct;
		this.createdOn = new Timestamp(System.currentTimeMillis());
		this.vc.incrementClock(creatorName);
	}
	
	public void incrementClock(String pUnit) {
		this.vc.incrementClock(pUnit);
	}
	
	public void decrementClock(String pUnit) {
		this.vc.decrementClock(pUnit);
	}
	
	/**
	 * La funzione getResourceKey() restituisce la chiave della risorsa
	 * @return the resourceKey
	 */
	public int getResourceKey() {
		return resourceKey;
	}

	/**
	 * La funzione setResourceKey() consente di impostare il valore della chiave della risorsa
	 * @param resourceKey the resourceKey to set
	 */
	public void setResourceKey(int resourceKey) {
		this.resourceKey = resourceKey;
	}

	/**
	 * La funzione getVectorClock() restituisce il clock vettoriale associato alla risorsa
	 * @return the vc
	 */
	public VectorClock getVectorClock() {
		return vc;
	}

	/**
	 *  * La funzione setVectorClock() consente di impostare il valore del clock vettoriale associato alla risorsa
	 * @param vc the vc to set
	 */
	public void setVectorClock(VectorClock vc) {
		this.vc = vc;
	}

	/**
	 * La funzione getContext() restituisce il contesto
	 * @return the ct
	 */
	public Context getContext() {
		return ct;
	}

	/**
	 * La funzione updateContext() aggiorna il contenuto del contesto e incrementa il valore del clock vettoriale della risorsa
	 * 
	 * @param ct contesto relativo alla risorsa 
	 * @param updaterName processo che aggiorna la risorsa 
	 * @return the ct
	 */
	
	public void updateContext(Context ct, String updaterName) {
		this.ct = ct;
		this.vc.incrementClock(updaterName);
	}
	
	/**
	 * La funzione getCreatedOn() restituisce il TimeStamp relativo alla creazione della risorsa
	 * @return the createdOn
	 */
	public Timestamp getCreatedOn() {
		return createdOn;
	}
		
	@Override
	public String toString() {
		return "vc = " + vc.toString() + ", " + ct.toString();
	}
}
